<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Class的继承</title>
  <style>
      div, li, p {
        line-height: 40px;
      }
      span {
        color: red;
      }
  </style>
</head>
<body>
  <h2>简介</h2>
  <ul>
    <li>
      Class可以通过extends关键字实现继承，这比ES5通过修改原型链实现继承更加清晰和方便
    </li>
    <li>
      子类<span>必须</span>在constructor方法种调用super方法，否则新建实例时会报错，<span>(super关键字这里表示父类的构造函数，用来新建父类的this对象)</span>这是因为子类没有自己的this对象，而是继承父类的this对象，然后对其进行加工。如果不调用super方法，子类就得不到this对象。
    </li>
    <li>
      如果子类没有定义constructor方法，那么这个方法会被默认添加<span>（要么就不定义constructor,让其取默认值。但是如果你定义了constructor，就必须在constructor中显式调用super）</span>
    </li>
    <li>
      在子类的构造函数中，只有调用super之后才可以使用this关键字，否则会报错
    </li>
    <li>
      Object.getPropertyOf()方法<span>可以用来从子类上获取父类</span>，这种方法可以判断一个类是否继承了另一个类
    </li>
    <li>
      super这个关键字即可以当作<span>函数</span>使用，也可以当作<span>对象</span>使用。在这两种情况下，它的用法完全不同
    </li>
    <li>
      由于对象总是继承其他对象的，所以可以在任意一个对象中使用
      super关键字
    </li>
  </ul>

  <h2>super关键字</h2>
  <h3>作为函数调用</h3>
  <ul>
    <li>
      ES6作为函数调用时代表父类的构造函数。ES6要求，子类的构造函数必须执行一次super函数
    </li>
    <li>
      作为函数时，super()只能用在子类的构造函数之中，用在其他地方就会报错
    </li>
  </ul>

  <h3>作为对象</h3>
  
  <h4>Ⅰ 在普通方法中，指向父类原型对象，所以定义在父类实例上的方法或属性时无法通过super调用的</h4>
  
  <h4>Ⅱ ES6规定，通过super调用父类的<span>方法</span>时，父类方法中的this指向子类</h4>
  
  <h4>
    Ⅲ 如果通过super<span>调用某个属性赋值</span>,这时的super就是this,赋值的属性会变成子类实例的属性
  </h4>
  
  <h4>
    Ⅳ 如果super作为对象用在静态方法之中，这时super将指向父类，而不是父类的原型对象
  </h4>

</body>
</html>